import os
import sys
from openai import OpenAI

# 添加项目根目录到Python路径，以便导入config_reader模块
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir))
sys.path.append(project_root)

from config_reader import get_deepseek_api_key

## 假设输入：
## 我的订单还没收到，订单号是 ORD-12345，请帮我处理。

# ==== 模拟数据库工具 ====
def query_database(order_id: str) -> str:
    """模拟查询订单数据库"""
    mock_db = {
        "ORD-12345": {"status": "已发货", "product": "无线耳机", "complaint_type": "物流延迟"},
        "ORD-67890": {"status": "已签收", "product": "机械键盘", "complaint_type": "质量问题"}
    }
    return str(mock_db.get(order_id, {"error": "订单不存在"}))

# ==== ReAct Agent ====
def react_agent(user_query: str, max_steps: int = 5):
    """基于 ReAct 框架的客服投诉处理 Agent"""
    # 从配置文件获取DeepSeek API密钥
    api_key = get_deepseek_api_key()
    client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com")

    # 对话历史，保存思考、动作、观察
    messages = [
        {"role": "system", "content": """
你是一个客服投诉处理 Agent，需要帮用户解决问题。
你可以使用工具 query_database(order_id) 来查询订单信息。
输出格式必须是：
Thought: 你的思考过程
Action: 工具调用，例如 query_database("ORD-12345")
Observation: 工具返回的结果（由系统自动填充）
最终答案请用 "Final Answer: ..." 开头
"""}
    ]

    messages.append({"role": "user", "content": user_query})

    for step in range(max_steps):
        # 1. 调用 LLM 进行思考并决定动作
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=messages,
            temperature=0.2
        )
        llm_output = response.choices[0].message.content.strip()
        print(f"🤔 第{step+1}步思考与动作:\n{llm_output}\n")

        messages.append({"role": "assistant", "content": llm_output})

        # 2. 如果模型决定结束，直接返回最终答案
        if "Final Answer:" in llm_output:
            # 提取最终答案部分
            final_answer_part = llm_output.split("Final Answer:")[1].strip()
            return final_answer_part

        # 3. 解析动作并执行
        if "Action:" in llm_output:
            action_str = llm_output.split("Action:")[1].strip()
            try:
                # 更安全的解析方式，避免使用eval
                if "query_database(" in action_str:
                    # 提取订单号，处理可能的引号
                    start_idx = action_str.find("query_database(") + 15
                    end_idx = action_str.find(")", start_idx)
                    if end_idx > start_idx:
                        order_id = action_str[start_idx:end_idx].strip('"\'')
                        result = query_database(order_id)
                    else:
                        result = "工具调用格式错误"
                else:
                    result = "未知的工具调用"
                observation = f"工具返回: {result}"
                print(f"👀 观察结果: {observation}\n")
                messages.append({"role": "user", "content": observation})
            except Exception as e:
                error_msg = f"工具调用出错: {str(e)}"
                print(f"❌ {error_msg}\n")
                messages.append({"role": "user", "content": error_msg})

    return "抱歉，我无法在限定步骤内解决你的问题。"

# ==== 运行示例 ====
if __name__ == "__main__":
    user_complaint = "我的订单还没收到，订单号是 ORD-12345，请帮我处理。"
    final_answer = react_agent(user_complaint)
    print("📢 客服回复：")
    print(final_answer)